{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "c14f75b4-563b-44f8-b172-81c7a2fa790e",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import copy\n",
    "import tempfile\n",
    "from io import StringIO\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4c88b717-505b-4aae-9e84-c2b9c2e5b0de",
   "metadata": {},
   "source": [
    "# 创建数组"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fc53dc5c-e608-4e6b-b317-d2059d9abf4b",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## Ones 和 zeros 填充方式\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "empty(shape[, dtype, order])|返回给定形状和类型的新数组，而无需初始化条目。\n",
    "empty_like(prototype[, dtype, order, subok, …])|返回形状和类型与给定数组相同的新数组。\n",
    "eye(N[, M, k, dtype, order])|返回一个二维数组，对角线上有一个，其他地方为零。\n",
    "identity(n[, dtype])|返回标识数组。\n",
    "ones(shape[, dtype, order])|返回给定形状和类型的新数组，并填充为1。\n",
    "ones_like(a[, dtype, order, subok, shape])|返回形状与类型与给定数组相同的数组。\n",
    "zeros(shape[, dtype, order])|返回给定形状和类型的新数组，并用零填充。\n",
    "zeros_like(a[, dtype, order, subok, shape])|返回形状与类型与给定数组相同的零数组。\n",
    "full(shape, fill_value[, dtype, order])|返回给定形状和类型的新数组，并用fill_value填充。\n",
    "full_like(a, fill_value[, dtype, order, …])|返回形状和类型与给定数组相同的完整数组。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8a7e04e0-939a-481b-9de5-6a52f0baab34",
   "metadata": {},
   "source": [
    "### numpy.empty(shape, dtype=float, order='C', *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5833cc98-a9e7-48ba-b2fe-0bae8a471194",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[       57029248,               0],\n",
       "       [140159032924040, 140159032923976]])"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.empty([2, 2], dtype=int)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2ef52718-25b5-4eff-b4a7-3ed7c71a8ab8",
   "metadata": {},
   "source": [
    "### numpy.empty_like(prototype, dtype=None, order='K', subok=True, shape=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "9012e49f-0119-41b2-992e-981e231386fe",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[56862384,        0,        0],\n",
       "       [       0,        0,        0]])"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = ([1,2,3], [4,5,6])\n",
    "np.empty_like(a)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e581558c-f37e-48b8-b25c-c07013576910",
   "metadata": {},
   "source": [
    "### numpy.eye(N, M=None, k=0, dtype=<class 'float'>, order='C', *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "ccd1f993-9f7e-4d37-bac1-b44f2df488ab",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 0],\n",
       "       [0, 0, 1],\n",
       "       [0, 0, 0]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.eye(3, k=1, dtype=int)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "32d8bd9d-f64d-48b5-98a9-52f87de0ced6",
   "metadata": {},
   "source": [
    "### numpy.identity(n, dtype=None, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "70d2ff48-abe1-418f-88f0-3e35bd5c5c85",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 0., 0.],\n",
       "       [0., 1., 0.],\n",
       "       [0., 0., 1.]])"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.identity(3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7670d1bd-f562-4909-aff8-6c24a89baeb7",
   "metadata": {},
   "source": [
    "### numpy.ones(shape, dtype=None, order='C', *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "3cd5ba6a-70c7-4076-b13d-56b989306c74",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 1, 1],\n",
       "       [1, 1, 1]])"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.ones(([2, 3]), dtype=int)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4f004081-cb08-424c-860d-7e8c23c5cf5b",
   "metadata": {},
   "source": [
    "### numpy.ones_like(a, dtype=None, order='K', subok=True, shape=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "dd8a6ece-8d85-4b9c-ab6f-0eb692993dbb",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 1., 1.],\n",
       "       [1., 1., 1.]])"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(6, dtype=float).reshape((2, 3))\n",
    "np.ones_like(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bbe02224-bbde-45c0-9f2f-df8f0358bd9e",
   "metadata": {},
   "source": [
    "### numpy.zeros(shape, dtype=float, order='C', *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "fb9a60ea-8060-4e7d-9b00-ca20ceba6d5d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([(0, 0), (0, 0)], dtype=[('x', '<i4'), ('y', '<i4')])"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.zeros((2), dtype=[('x', 'i4'), ('y', 'i4')])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "d306ae2a-003e-491e-b88d-d4020b2fe60f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([(0, 0), (1, 1)], dtype=[('x', '<i4'), ('y', '<i4')])"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(2, dtype=[('x', 'i4'), ('y', 'i4')])\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "d14a1182-fd5c-4ac4-84da-c13f7d24649b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1], dtype=int32)"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[\"x\"]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "e2a06972-fab0-4fc8-affa-f310855d12ef",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1], dtype=int32)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x[\"y\"]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "04302593-d6a9-40de-8230-2bacabd5d054",
   "metadata": {},
   "source": [
    "### numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "8f8c5870-db9d-4734-8ce9-f8e217837a49",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 0., 0.])"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(3, dtype=float)\n",
    "x\n",
    "np.zeros_like(x)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9d046727-1ee8-44c1-bd82-31f0e4171c45",
   "metadata": {},
   "source": [
    "### numpy.full(shape, fill_value, dtype=None, order='C', *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "a2f7043f-0456-438a-8265-6b83e72019e5",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[inf, inf],\n",
       "       [inf, inf]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.full((2, 2), np.inf)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "b2bacce6-28a7-4651-b15a-5467568ff865",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[10, 10],\n",
       "       [10, 10]])"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.full((2, 2), 10)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "fdf28035-65aa-4adb-acb1-1ecc4676bebe",
   "metadata": {},
   "source": [
    "### numpy.full_like(a, fill_value, dtype=None, order='K', subok=True, shape=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "f39cd138-a6f7-406d-b392-3d6f106c517c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 1, 1, 1, 1, 1])"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(6, dtype=int)\n",
    "np.full_like(x, 1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "0c09abc5-f2f8-408e-b3a2-843db2caef34",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 0, 0, 0, 0, 0])"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.full_like(x, 0.1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "7275d895-a1b3-4bae-8506-428da4ce16fe",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.1, 0.1, 0.1, 0.1, 0.1, 0.1])"
      ]
     },
     "execution_count": 17,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.full_like(x, 0.1, dtype=np.double)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "8d22ffaf-801b-46c3-bdb4-3961602e2f21",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([nan, nan, nan, nan, nan, nan])"
      ]
     },
     "execution_count": 18,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.full_like(x, np.nan, dtype=np.double)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "bf696e15-8ea7-4fb7-a5fc-82d0f67c31d0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[  0,   0, 255],\n",
       "        [  0,   0, 255]],\n",
       "\n",
       "       [[  0,   0, 255],\n",
       "        [  0,   0, 255]]])"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.zeros([2, 2, 3], dtype=int)\n",
    "np.full_like(x, [0, 0, 255])"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a54e241-b154-4872-b22e-85ccc755633c",
   "metadata": {
    "tags": [],
    "toc-hr-collapsed": true
   },
   "source": [
    "## 从现有的数据创建\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "array(object[, dtype, copy, order, subok, ndmin])|创建一个数组。\n",
    "asarray(a[, dtype, order])|将输入转换为数组。\n",
    "asanyarray(a[, dtype, order])|将输入转换为ndarray，但通过ndarray子类。\n",
    "ascontiguousarray(a[, dtype])|返回内存中的连续数组（ndim > = 1）（C顺序）。\n",
    "asmatrix(data[, dtype])|将输入解释为矩阵。\n",
    "copy(a[, order])|返回给定对象的数组副本。\n",
    "frombuffer(buffer[, dtype, count, offset])|将缓冲区解释为一维数组。\n",
    "fromfile(file[, dtype, count, sep, offset])|根据文本或二进制文件中的数据构造一个数组。\n",
    "fromfunction(function, shape, **kwargs)|通过在每个坐标上执行一个函数来构造一个数组。\n",
    "fromiter(iterable, dtype[, count])|从可迭代对象创建一个新的一维数组。\n",
    "fromstring(string[, dtype, count, sep])|从字符串中的文本数据初始化的新一维数组。\n",
    "loadtxt(fname[, dtype, comments, delimiter, …])|从文本文件加载数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "10f48a33-9164-4004-9535-7d4ca6a0f25b",
   "metadata": {},
   "source": [
    "### numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "2814b75c-36ab-492c-b7ab-d441e9382fff",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1., 2., 3.])"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array([1, 2, 3.0])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "dab66c6a-5e9e-4b85-9825-118865329483",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1.+0.j, 2.+0.j, 3.+0.j]])"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array([1, 2, 3], ndmin=2, dtype=complex)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "1d5716a4-9d0b-4cd4-b024-c01b60b19a54",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 3], dtype=int32)"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([(1,2),(3,4)],dtype=[('a','<i4'),('b','<i4')])\n",
    "x['a']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "7e15c423-c603-48bd-81d1-c0991293a452",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[1, 2],\n",
       "        [3, 4]])"
      ]
     },
     "execution_count": 23,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.array(np.asmatrix('1 2; 3 4'), subok=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e69c17cd-24ba-4f6b-937e-bfa534f9ca48",
   "metadata": {
    "tags": []
   },
   "source": [
    "### numpy.asarray(a, dtype=None, order=None, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "3531eb95-13b1-483e-95f8-c2cc9b0630a9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 24,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([1, 2], dtype=np.float32)\n",
    "np.shares_memory(np.asarray(a, dtype=np.float32), a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "829b9203-2482-4f61-a0d0-a831b43f9a01",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.shares_memory(np.asarray(a, dtype=np.float64), a)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "ecb30d62-ad69-4dec-bb12-016d56e03ed4",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 26,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([(1., 2), (3., 4)], dtype='f4,i4').view(np.recarray)\n",
    "np.asarray(a) is a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "763d709e-2a2e-4c40-80ea-a695a89e47ea",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.asanyarray(a) is a"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "067e2827-2af7-4021-8926-c3c2a432c3b3",
   "metadata": {},
   "source": [
    "### numpy.asanyarray(a, dtype=None, order=None, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "f5a85cf7-f2cf-438d-960f-ecc20ca089ee",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([(1., 2), (3., 4)], dtype='f4,i4').view(np.recarray)\n",
    "np.asanyarray(a) is a"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f81f426a-5b33-468f-89b8-fc341505192d",
   "metadata": {},
   "source": [
    "### numpy.ascontiguousarray(a, dtype=None, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "9a7cd4cb-24c8-40d3-9d94-ac0255c977ed",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.ones((2, 3), order='F')\n",
    "x.flags['F_CONTIGUOUS']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "37219278-a8f0-4f7f-899f-10f3e75b3f73",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = np.ascontiguousarray(x)\n",
    "y.flags['C_CONTIGUOUS']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "7616291a-c137-4127-abb7-c09fce67ec08",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "False"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.may_share_memory(x, y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "ef4402ee-5435-4d53-b480-1b48cc0dfe4a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.ones((2, 3), order='C')\n",
    "x.flags['C_CONTIGUOUS']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "fa550f10-4ad9-47d4-aaa1-2cbe3236ac8c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "True"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "y = np.ascontiguousarray(x)\n",
    "x is y"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ec97897a-5c95-4067-a433-4973c57f6056",
   "metadata": {},
   "source": [
    "### numpy.asmatrix(data, dtype=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "935c4813-1e29-4f78-980a-e6056798b572",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[5, 2],\n",
       "        [3, 4]])"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([[1, 2], [3, 4]])\n",
    "m = np.asmatrix(x)\n",
    "x[0,0] = 5\n",
    "m"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e9251b59-58c4-4e61-bc92-3de41ebedce3",
   "metadata": {},
   "source": [
    "### numpy.copy(a, order='K', subok=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "59fcc3ab-8371-47b6-b97d-9115c6edaf01",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 'm', list([10, 3, 4])], dtype=object)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([1, 'm', [2, 3, 4]], dtype=object)\n",
    "b = np.copy(a)\n",
    "b[2][0] = 10\n",
    "a"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "495442fb-8abf-4245-968b-c50d15df50a3",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([1, 'm', list([10, 3, 4])], dtype=object),\n",
       " array([1, 'm', list([2, 3, 4])], dtype=object))"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = np.array([1, 'm', [2, 3, 4]], dtype=object)\n",
    "c = copy.deepcopy(a)\n",
    "c[2][0] = 10\n",
    "c, a"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e5b6684f-4844-4a14-8cf4-989a47075c0f",
   "metadata": {},
   "source": [
    "### numpy.frombuffer(buffer, dtype=float, count=-1, offset=0, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "d01c3c16-318f-41e9-8e4e-8d29aaee671e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([b'w', b'o', b'r', b'l', b'd'], dtype='|S1')"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = b'hello world'\n",
    "np.frombuffer(s, dtype='S1', count=5, offset=6)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "9f059c81-5a7b-4127-9d93-73b04d0ea8e2",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2], dtype=uint8)"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.frombuffer(b'\\x01\\x02', dtype=np.uint8)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "7e048a27-716b-4399-9376-097536a36e2d",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 3], dtype=uint8)"
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.frombuffer(b'\\x01\\x02\\x03\\x04\\x05', dtype=np.uint8, count=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "92030ad1-1c9f-4afa-939c-1f9867481353",
   "metadata": {},
   "source": [
    "### numpy.fromfile(file, dtype=float, count=-1, sep='', offset=0, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "id": "1500973d-07e6-4e70-86d8-1e72c9d03be7",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([((10, 0), 98.25)],\n",
       "      dtype=[('time', [('min', '<i8'), ('sec', '<i8')]), ('temp', '<f8')])"
      ]
     },
     "execution_count": 40,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dt = np.dtype([('time', [('min', np.int64), ('sec', np.int64)]),('temp', float)])\n",
    "x = np.zeros((1,), dtype=dt)\n",
    "x['time']['min'] = 10;\n",
    "x['temp'] = 98.25\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "id": "4d219b76-1e9d-4935-88d0-ac929ae4ff4a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([((10, 0), 98.25)],\n",
       "      dtype=[('time', [('min', '<i8'), ('sec', '<i8')]), ('temp', '<f8')])"
      ]
     },
     "execution_count": 41,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "fname = tempfile.mkstemp()[1]\n",
    "x.tofile(fname)\n",
    "np.fromfile(fname, dtype=dt)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 42,
   "id": "337ba1c6-7ce8-4dbc-9094-a9704d716bd2",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([((10, 0), 98.25)],\n",
       "      dtype=[('time', [('min', '<i8'), ('sec', '<i8')]), ('temp', '<f8')])"
      ]
     },
     "execution_count": 42,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.save(fname, x)\n",
    "np.load(fname + '.npy')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "07a75220-fd2b-4098-adcf-06499067a25c",
   "metadata": {},
   "source": [
    "### numpy.fromfunction(function, shape, *, dtype=<class 'float'>, like=None, **kwargs)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 43,
   "id": "bee8d2b7-2455-42da-95a6-9ed60625e0b1",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0.],\n",
       "       [1., 1.]])"
      ]
     },
     "execution_count": 43,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.fromfunction(lambda i, j: i, (2, 2), dtype=float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 44,
   "id": "a3b89ad4-31cd-4581-b459-86bf8edd3a47",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 1.],\n",
       "       [0., 1.]])"
      ]
     },
     "execution_count": 44,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.fromfunction(lambda i, j: j, (2, 2), dtype=float)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "id": "59ac8d59-c840-4d54-9097-b0d930e7a589",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ True, False, False],\n",
       "       [False,  True, False],\n",
       "       [False, False,  True]])"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.fromfunction(lambda i, j: i == j, (3, 3), dtype=int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 46,
   "id": "80aae503-2c76-40ba-a370-814ca502e97a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2],\n",
       "       [1, 2, 3],\n",
       "       [2, 3, 4]])"
      ]
     },
     "execution_count": 46,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.fromfunction(lambda i, j: i + j, (3, 3), dtype=int)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6677cf5d-c0a5-4d61-9c00-7b27c7d07271",
   "metadata": {},
   "source": [
    "### numpy.fromiter(iter, dtype, count=-1, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 47,
   "id": "ef69843a-029d-400a-8c88-f6d763800e25",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 0.,  1.,  4.,  9., 16.])"
      ]
     },
     "execution_count": 47,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "iterable = (x*x for x in range(5))\n",
    "np.fromiter(iterable, float)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "60943312-4e77-4165-9594-0b27c105238e",
   "metadata": {},
   "source": [
    "### numpy.fromstring(string, dtype=float, count=-1, *, sep, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 48,
   "id": "56e63028-a49c-4527-a4be-179e3c4172be",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2])"
      ]
     },
     "execution_count": 48,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.fromstring('1 2', dtype=int, sep=' ')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "980524d3-e905-4a55-99f7-d54f58731071",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2])"
      ]
     },
     "execution_count": 49,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.fromstring('1, 2', dtype=int, sep=',')"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "98a91de2-7a85-4957-8c51-f39283f971d5",
   "metadata": {},
   "source": [
    "### numpy.loadtxt(fname, dtype=<class 'float'>, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None, *, quotechar=None, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 50,
   "id": "f527fcdf-6a29-45de-8099-f2042484ba1f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 1.],\n",
       "       [2., 3.]])"
      ]
     },
     "execution_count": 50,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = StringIO(\"0 1\\n2 3\")\n",
    "np.loadtxt(c)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 51,
   "id": "6ad819fd-bb1a-4515-b733-1133abdae7fc",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([(b'M', 21, 72.), (b'F', 35, 58.)],\n",
       "      dtype=[('gender', 'S1'), ('age', '<i4'), ('weight', '<f4')])"
      ]
     },
     "execution_count": 51,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d = StringIO(\"M 21 72\\nF 35 58\")\n",
    "np.loadtxt(d, dtype={'names': ('gender', 'age', 'weight'),'formats': ('S1', 'i4', 'f4')})"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "52c7e1c4-8bfd-4c54-89a6-7ce2c5562158",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([1., 3.]), array([2., 4.]))"
      ]
     },
     "execution_count": 52,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "c = StringIO(\"1,0,2\\n3,0,4\")\n",
    "x, y = np.loadtxt(c, delimiter=',', usecols=(0, 2), unpack=True)\n",
    "x, y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 53,
   "id": "c6ab8214-5f26-4d75-ae96-9d3bf649046b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1., 3.],\n",
       "       [3., 5.]])"
      ]
     },
     "execution_count": 53,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "s = StringIO(\"1.618, 2.296\\n3.141, 4.669\\n\")\n",
    "conv = {\n",
    "    0: lambda x: np.floor(float(x)),\n",
    "    1: lambda x: np.ceil(float(x)),\n",
    "}\n",
    "np.loadtxt(s, delimiter=\",\", converters=conv)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "c1568adc-2743-4769-9aa3-3a901beb381b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1.,  2.],\n",
       "       [ 2.,  4.],\n",
       "       [ 3.,  9.],\n",
       "       [ 4., 16.]])"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "d = StringIO(\"1 2\\n2 4\\n3 9 12\\n4 16 20\")\n",
    "np.loadtxt(d, usecols=(0, 1))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ac5f3a41-30eb-405b-8954-20f246a349f9",
   "metadata": {},
   "source": [
    "## 创建记录数组（numpy.rec）\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "core.records.array(obj[, dtype, shape, …])|从各种各样的对象构造一个记录数组。\n",
    "core.records.fromarrays(arrayList[, dtype, …])|从（平面）数组列表创建记录数组\n",
    "core.records.fromrecords(recList[, dtype, …])|从文本格式的记录列表创建一个rearray\n",
    "core.records.fromstring(datastring[, dtype, …])|根据字符串中包含的二进制数据创建（只读）记录数组\n",
    "core.records.fromfile(fd[, dtype, shape, …])|根据二进制文件数据创建数组"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "de8256d8-adf5-4161-a595-499706d1a5b6",
   "metadata": {},
   "source": [
    "## 创建字符数组（numpy.char）\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "core.defchararray.array(obj[, itemsize, …])|创建一个chararray。\n",
    "core.defchararray.asarray(obj[, itemsize, …])|将输入转换为chararray，仅在必要时复制数据。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bd0a1ce0-c1b5-4e5a-9d79-0eeee06d2414",
   "metadata": {
    "tags": [],
    "toc-hr-collapsed": true
   },
   "source": [
    "## 数值范围\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "arange([start,] stop[, step,][, dtype])|返回给定间隔内的均匀间隔的值。\n",
    "linspace(start, stop[, num, endpoint, …])|返回指定间隔内的等间隔数字。\n",
    "logspace(start, stop[, num, endpoint, base, …])|返回数以对数刻度均匀分布。\n",
    "geomspace(start, stop[, num, endpoint, …])|返回数字以对数刻度（几何级数）均匀分布。\n",
    "meshgrid(*xi, **kwargs)|从坐标向量返回坐标矩阵。\n",
    "mgrid|nd_grid实例，它返回一个密集的多维“ meshgrid”。\n",
    "ogrid|nd_grid实例，它返回一个开放的多维“ meshgrid”。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4b7e99c4-a27a-41dd-8dcd-5a0707298702",
   "metadata": {},
   "source": [
    "### numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "id": "06fad74d-dee6-4f55-b5bc-99ec5e90d4a4",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-3, -2, -1,  0,  1,  2,  3,  4,  5,  6,  7,  8])"
      ]
     },
     "execution_count": 55,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(-3, 3, 0.5, dtype=int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "2b1f9ed5-4712-4932-9a17-000b768fcc2c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "([0, 1, 7776, 8801, 6176, 625, 6576, 4001],\n",
       " [0, 1, 7776, 7185, 0, 5969, 4816, 3361])"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "power = 40\n",
    "modulo = 10000\n",
    "x1 = [(n ** power) % modulo for n in range(8)]\n",
    "x2 = [(n ** power) % modulo for n in np.arange(8)]\n",
    "x1, x2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "id": "809d53e9-d197-42e4-8300-b69282f0a3be",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 1, 2])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(3)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "id": "341f0cbb-474c-45c0-8aff-e6ca186704d2",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0., 1., 2.])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(3.0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "id": "14efd2ab-8d8c-40f0-84db-be9da38930eb",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 4, 5, 6])"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(3,7)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "id": "f9727a86-d1fc-4fb4-9c84-4fff4908cae8",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 5])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.arange(3,7,2)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "602a4bb5-7d67-44aa-8b8c-f4421b9f8cce",
   "metadata": {},
   "source": [
    "### numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "id": "882b06de-526c-466e-8c30-a0ee21e0c7b2",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2.  , 2.25, 2.5 , 2.75, 3.  ])"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linspace(2.0, 3.0, num=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "ae69f6f3-8737-4a72-976d-8c23d0eff4e5",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([2. , 2.2, 2.4, 2.6, 2.8])"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linspace(2.0, 3.0, num=5, endpoint=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "id": "79c7ce28-ea97-422a-b96f-60510962178f",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([2.  , 2.25, 2.5 , 2.75, 3.  ]), 0.25)"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linspace(2.0, 3.0, num=5, retstep=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "id": "4c4e5c35-b3a5-41cc-bf0e-0fc631b449a7",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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a82fPz/6OhwOW+np6VZ5eXkMq3K+pqYmS5L1xhtvxLoUxzly5Ih17rnnWtu2bbN+8IMfWAsXLox1SY6zZMkS6+KLL451GY43ffp06/rrr28z9pOf/MSaNWtWjCpyHknWli1boq8jkYiVlpZmPfjgg9Gxw4cPW2632/rjH//YKzVx5uUUWltbVVtbK7/fHx1LSEiQ3+9XdXV1DCtzvmAwKEkaPHhwjCtxnvnz52v69Olt/l6jZ23dulU5OTn62c9+ptTUVE2cOFEbN26MdVmOM2nSJFVVVemjjz6SJP3973/Xm2++qcsvvzzGlTnX3r17FQgE2vz74fV6lZeX12vHRcf9VumedvDgQYXDYfl8vjbjPp9Pu3fvjlFVzheJRLRo0SJNnjxZ48aNi3U5jvL000+rrq5OO3bsiHUpjvbpp5/q0UcfVXFxse644w7t2LFDt956q5KTkzVnzpxYl+cYJSUlCoVCGj16tBITExUOh3Xfffdp1qxZsS7NsQKBgCS1e1z8+md2I7wgLs2fP187d+7Um2++GetSHKWhoUELFy7Utm3blJKSEutyHC0SiSgnJ0crVqyQJE2cOFE7d+7U+vXrCS896JlnntFTTz2lTZs26fzzz1d9fb0WLVqk9PR01tnB+NroFIYMGaLExEQ1Nja2GW9sbFRaWlqMqnK2BQsW6MUXX9Rrr72ms846K9blOEptba2ampp04YUXKikpSUlJSXrjjTf08MMPKykpSeFwONYlOsawYcM0duzYNmNjxozRvn37YlSRM91+++0qKSnRlVdeqfHjx+vaa6/V4sWLVV5eHuvSHOvrY18sj4uEl1NITk5Wdna2qqqqomORSERVVVXKz8+PYWXOY1mWFixYoC1btujVV1/VyJEjY12S40yZMkXvv/++6uvro1tOTo5mzZql+vp6JSYmxrpEx5g8efJJt/p/9NFH+t73vhejipzp2LFjSkhoeyhLTExUJBKJUUXON3LkSKWlpbU5LoZCIb3zzju9dlzka6MuKC4u1pw5c5STk6Pc3FytWbNGzc3NKioqinVpjjJ//nxt2rRJf/7znzVgwIDod6der1f9+/ePcXXOMGDAgJOuITr99NN15plncm1RD1u8eLEmTZqkFStW6Oc//7lqamq0YcMGbdiwIdalOUphYaHuu+8+jRgxQueff77ee+89rV69Wtdff32sSzPa0aNH9fHHH0df7927V/X19Ro8eLBGjBihRYsW6d5779W5556rkSNHaunSpUpPT9eMGTN6p8BeuafJAdauXWuNGDHCSk5OtnJzc62333471iU5jqR2t9///vexLs3RuFXaPi+88II1btw4y+12W6NHj7Y2bNgQ65IcJxQKWQsXLrRGjBhhpaSkWKNGjbLuvPNOq6WlJdalGe21115r99/jOXPmWJZ14nbppUuXWj6fz3K73daUKVOsPXv29Fp9LsviMYQAAMAcXPMCAACMQngBAABGIbwAAACjEF4AAIBRCC8AAMAohBcAAGAUwgsAADAK4QUAABiF8AIAAIxCeAEAAEYhvAAAAKP8H2a0oZhfBad0AAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 8\n",
    "y = np.zeros(N)\n",
    "x1 = np.linspace(0, 10, N, endpoint=True)\n",
    "x2 = np.linspace(0, 10, N, endpoint=False)\n",
    "plt.plot(x1, y, 'o')\n",
    "plt.plot(x2, y + 0.5, 'o')\n",
    "plt.ylim([-0.5, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "43c5b31d-3eb0-4e93-ac64-73f6d6211327",
   "metadata": {},
   "source": [
    "### numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "id": "4d2fe6d2-d947-491e-a1eb-b68a2525d8e8",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 100.        ,  215.443469  ,  464.15888336, 1000.        ])"
      ]
     },
     "execution_count": 65,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.logspace(2.0, 3.0, num=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "id": "19ca1d35-111e-4fd6-8c31-993fcd2de4c4",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([100.        , 177.827941  , 316.22776602, 562.34132519])"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.logspace(2.0, 3.0, num=4, endpoint=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "id": "e1f19722-8d47-4e8f-9208-d8772f670145",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([4.        , 5.0396842 , 6.34960421, 8.        ])"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.logspace(2.0, 3.0, num=4, base=2.0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "id": "6279c0fd-66ac-4b5e-badf-f2f807a1dfd1",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 10\n",
    "x1 = np.logspace(0.1, 1, N, endpoint=True)\n",
    "x2 = np.logspace(0.1, 1, N, endpoint=False)\n",
    "y = np.zeros(N)\n",
    "plt.plot(x1, y, 'o')\n",
    "plt.plot(x2, y + 0.5, 'o')\n",
    "plt.ylim([-0.5, 1])\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "77ec872c-1e7b-4384-9223-3e1cd75aec15",
   "metadata": {},
   "source": [
    "### numpy.geomspace(start, stop, num=50, endpoint=True, dtype=None, axis=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "id": "aab5fbdf-e5c9-4cb7-884e-4a6dc695b2b5",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([   1.,   10.,  100., 1000.])"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(1, 1000, num=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "id": "5da86f85-32fb-4eca-84f1-d609790145ef",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  1.,  10., 100.])"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(1, 1000, num=3, endpoint=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "id": "515e23a8-654b-4f75-8f4d-6640be5504fc",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  1.        ,   5.62341325,  31.6227766 , 177.827941  ])"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(1, 1000, num=4, endpoint=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "id": "48cb2d1e-daa3-45ba-b747-057b3ed561a8",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  1.,   2.,   4.,   8.,  16.,  32.,  64., 128., 256.])"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(1, 256, num=9)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "id": "aeb1cb88-4aa9-4b2f-be7a-74ab9de05e2e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  1,   2,   4,   7,  16,  32,  63, 127, 256])"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(1, 256, num=9, dtype=int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "id": "5bfc2a17-2028-4bd2-93f7-cc97d9c4585c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([  1,   2,   4,   8,  16,  32,  64, 128, 256])"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.around(np.geomspace(1, 256, num=9)).astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "727d7e64-9730-41c4-bf4b-c619dc994752",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1000.,  100.,   10.,    1.])"
      ]
     },
     "execution_count": 75,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(1000, 1, num=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "id": "2f525813-221e-43c1-a0c8-ed4c00c49dcb",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1000.,  -100.,   -10.,    -1.])"
      ]
     },
     "execution_count": 76,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(-1000, -1, num=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "id": "86a9c4f2-9ecf-4028-bd56-8062a306658e",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.   +1.j, 0.  +10.j, 0. +100.j, 0.+1000.j])"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(1j, 1000j, num=4)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "id": "8d002e4d-de51-4d7a-9ce8-631041a96f14",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1.00000000e+00+0.j        , -7.07106781e-01+0.70710678j,\n",
       "        6.12323400e-17+1.j        ,  7.07106781e-01+0.70710678j,\n",
       "        1.00000000e+00+0.j        ])"
      ]
     },
     "execution_count": 78,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.geomspace(-1+0j, 1+0j, num=5)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "id": "39cb43d8-d0d8-44f6-b182-0673ea53f2f0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGnCAYAAABl41fiAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAnTElEQVR4nO3df3BUdZrv8U/nB4kZCRK5EH4qLiwSkDAEgaAzgDBGhpXN1OiyVO3yo9SpsWCuTrbk3rjsQMZZo+U4YI2MOuuOGZ2ljHgXdodREKMhhUSRYLyCBSNXhriQBN1AB8LSpNN9/0CyxqQ753Q6/XQ371dVCvuc7/ecp08eTn88fZr2BIPBoAAAAIykWBcAAACubIQRAABgijACAABMEUYAAIApwggAADBFGAEAAKYIIwAAwBRhBAAAmCKMAAAAU4QRAABgylUYeeaZZzRlyhRlZ2crOztbhYWFev3118PO2bJli2688UZlZmbqpptu0muvvdanggEAQHJxFUZGjRqlxx57THV1ddq/f79uu+02/eVf/qUOHTrU4/i9e/dq6dKluueee/TBBx+ouLhYxcXFOnjwYFSKBwAAic/T1y/Ky8nJ0RNPPKF77rmn27olS5aora1N27dv71w2a9YsTZ06Vc8++2xfdgsAAJJEWqQTOzo6tGXLFrW1tamwsLDHMbW1tSopKemyrKioSNu2bQu7bZ/PJ5/P1/k4EAiopaVF1157rTweT6QlAwCAGAoGgzp79qxGjBihlJTQb8a4DiMfffSRCgsLdeHCBV199dXaunWr8vLyehzb1NSkYcOGdVk2bNgwNTU1hd1HeXm5ysrK3JYGAADi0GeffaZRo0aFXO86jEyYMEH19fXyer169dVXtXz5cu3evTtkIIlEaWlplysqXq9XY8aM0SeffKLBgweHnev3+7V7927NmTNHaWk9P73exoRbH2qdk/3Gg/6uMxrbj2QbbuY4HXul9kksakyWPumPHon0ucVasp5L3M7jNSe806dPa/z48Ro4cGDYca6fwYABAzRu3DhJUkFBgd5//3099dRTeu6557qNzc3NVXNzc5dlzc3Nys3NDbuPjIwMZWRkdFs+ePBgXXvttWHntre3KysrSzk5OUpPT49oTLj1odY52W886O86o7H9SLbhZo7TsVdqn8SixmTpk/7okUifW6wl67nE7Txec5zp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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = 10\n",
    "y = np.zeros(N)\n",
    "plt.semilogx(np.geomspace(1, 1000, N, endpoint=True), y + 1, 'o')\n",
    "plt.semilogx(np.geomspace(1, 1000, N, endpoint=False), y + 2, 'o')\n",
    "plt.axis([0.5, 2000, 0, 3])\n",
    "plt.grid(True, color='0.7', linestyle='-', which='both', axis='both')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "b8534f42-326b-409f-a187-bf7e17dfd0c1",
   "metadata": {},
   "source": [
    "### numpy.meshgrid(*xi, copy=True, sparse=False, indexing='xy')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "id": "d2ddb0d2-1855-46be-9394-70d6145e6132",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0. , 0.5, 1. ],\n",
       "        [0. , 0.5, 1. ]]),\n",
       " array([[0., 0., 0.],\n",
       "        [1., 1., 1.]]))"
      ]
     },
     "execution_count": 80,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "nx, ny = (3, 2)\n",
    "x = np.linspace(0, 1, nx)\n",
    "y = np.linspace(0, 1, ny)\n",
    "xv, yv = np.meshgrid(x, y)\n",
    "xv, yv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "id": "2f0700d5-a32d-41be-94e2-de85d78417fc",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiMAAAGdCAYAAADAAnMpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAfO0lEQVR4nO3df2xV9f3H8dfthd5ipAXTcVvo3Rpwij8QZpGuYuP6TWcTDM4YYycGkChMZcbRbALyoypKGTpSJ1Uik+EfuqJYjJGmTjsbEbuQFJow+WEQkKrcK81mb1eUwr2f7x8L13Vtsbf29s0tz0dy/uD0c+799EMP98m5P+pxzjkBAAAYSbGeAAAAuLARIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwNQw6wn0RTQa1RdffKGRI0fK4/FYTwcAAPSBc07t7e0aO3asUlJ6v/6RFDHyxRdfKBAIWE8DAAD0Q0tLi3Jycnr9elLEyMiRIyX955tJT083ng0AAOiLcDisQCAQexzvTVLEyNmnZtLT04kRAACSzHe9xIIXsAIAAFPECAAAMEWMAAAAU8QIAAAwRYwAAABTxAgAADBFjAAAAFPECAAAMJUUH3qWCJFIRDt27NDx48eVnZ2twsJCeb1e62kBFxTOQ8DW+XIOxn1l5P3339fMmTM1duxYeTwevfHGG995TENDg6699lr5fD5deuml2rx5cz+mOnBqamqUm5uroqIizZo1S0VFRcrNzVVNTY3pvIALCechYOt8OgfjjpGOjg5NnjxZVVVVfRp/5MgR3XzzzSoqKlJzc7N+85vf6N5779Xbb78d92QHQk1NjW6//XZ99tlnXfZ//vnnuv322/mHEBgEnIeArfPtHPQ451y/D/Z4tG3bNt166629jlm8eLG2b9+uf/zjH7F9v/zlL/XVV1+prq6uT/cTDoeVkZGhtra27/W7aSKRiHJzc7st/lkej0c5OTk6cuQIl4qBBOE8BGwN5jnY18fvhL+AtbGxUcXFxV32lZSUqLGxsddjTp06pXA43GUbCDt27Oh18SXJOaeWlhbt2LFjQO4PQHech4Ct8/EcTHiMBINB+f3+Lvv8fr/C4bC+/vrrHo+pqKhQRkZGbAsEAgMyl+PHjw/oOADx4zwEbJ2P5+B5+dbepUuXqq2tLba1tLQMyO1mZ2cP6DgA8eM8BGydj+dgwmMkKytLoVCoy75QKKT09HSNGDGix2N8Pp/S09O7bAOhsLBQOTk58ng8PX7d4/EoEAiosLBwQO4PQHech4Ct8/EcTHiMFBQUqL6+vsu+d955RwUFBYm+6268Xq+eeeYZSer2l3D2z5WVlbxoDkggzkPA1vl4DsYdI//+97/V3Nys5uZmSf95625zc7OOHTsm6T9PscyZMyc2/r777tPhw4f18MMP68CBA3ruuef06quvatGiRQPzHcTptttu09atWzVu3Lgu+3NycrR161bddtttJvMCLiSch4Ct8+0cjPutvQ0NDSoqKuq2f+7cudq8ebPuvvtuHT16VA0NDV2OWbRokfbt26ecnBytWLFCd999d5/vc6De2vvfzpdPnQMuZJyHgK1En4N9ffz+Xp8zMlgSESMAACCxzpvPGQEAADgXYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgKl+xUhVVZVyc3OVlpam/Px87dq165zjKysrdfnll2vEiBEKBAJatGiRvvnmm35NGAAADC1xx8iWLVtUVlam8vJy7d69W5MnT1ZJSYm+/PLLHse/8sorWrJkicrLy7V//369+OKL2rJlix555JHvPXkAAJD84o6RdevWaf78+Zo3b56uvPJKbdiwQRdddJE2bdrU4/gPP/xQ06dP16xZs5Sbm6ubbrpJd95553deTQEAABeGuGKks7NTTU1NKi4u/vYGUlJUXFysxsbGHo+5/vrr1dTUFIuPw4cPq7a2VjNmzOj1fk6dOqVwONxlAwAAQ9OweAa3trYqEonI7/d32e/3+3XgwIEej5k1a5ZaW1t1ww03yDmnM2fO6L777jvn0zQVFRV67LHH4pkaAABIUgl/N01DQ4NWr16t5557Trt371ZNTY22b9+uVatW9XrM0qVL1dbWFttaWloSPU0AAGAkrisjmZmZ8nq9CoVCXfaHQiFlZWX1eMyKFSs0e/Zs3XvvvZKkSZMmqaOjQwsWLNCyZcuUktK9h3w+n3w+XzxTAwAASSquKyOpqanKy8tTfX19bF80GlV9fb0KCgp6PObkyZPdgsPr9UqSnHPxzhcAAAwxcV0ZkaSysjLNnTtXU6dO1bRp01RZWamOjg7NmzdPkjRnzhyNGzdOFRUVkqSZM2dq3bp1+slPfqL8/HwdOnRIK1as0MyZM2NRAgAALlxxx0hpaalOnDihlStXKhgMasqUKaqrq4u9qPXYsWNdroQsX75cHo9Hy5cv1+eff64f/OAHmjlzpp588smB+y4AAEDS8rgkeK4kHA4rIyNDbW1tSk9Pt54OAADog74+fvO7aQAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmOpXjFRVVSk3N1dpaWnKz8/Xrl27zjn+q6++0sKFC5WdnS2fz6fLLrtMtbW1/ZowAAAYWobFe8CWLVtUVlamDRs2KD8/X5WVlSopKdHBgwc1ZsyYbuM7Ozv185//XGPGjNHWrVs1btw4ffrppxo1atRAzB8AACQ5j3POxXNAfn6+rrvuOq1fv16SFI1GFQgE9OCDD2rJkiXdxm/YsEFPPfWUDhw4oOHDh/drkuFwWBkZGWpra1N6enq/bgMAAAyuvj5+x/U0TWdnp5qamlRcXPztDaSkqLi4WI2NjT0e8+abb6qgoEALFy6U3+/X1VdfrdWrVysSifR6P6dOnVI4HO6yAQCAoSmuGGltbVUkEpHf7++y3+/3KxgM9njM4cOHtXXrVkUiEdXW1mrFihX6wx/+oCeeeKLX+6moqFBGRkZsCwQC8UwTAAAkkYS/myYajWrMmDF64YUXlJeXp9LSUi1btkwbNmzo9ZilS5eqra0ttrW0tCR6mgAAwEhcL2DNzMyU1+tVKBTqsj8UCikrK6vHY7KzszV8+HB5vd7YviuuuELBYFCdnZ1KTU3tdozP55PP54tnagAAIEnFdWUkNTVVeXl5qq+vj+2LRqOqr69XQUFBj8dMnz5dhw4dUjQaje37+OOPlZ2d3WOIAACAC0vcT9OUlZVp48aNeumll7R//37df//96ujo0Lx58yRJc+bM0dKlS2Pj77//fv3zn//UQw89pI8//ljbt2/X6tWrtXDhwoH7LgAAQNKK+3NGSktLdeLECa1cuVLBYFBTpkxRXV1d7EWtx44dU0rKt40TCAT09ttva9GiRbrmmms0btw4PfTQQ1q8ePHAfRcAACBpxf05Ixb4nBEAAJJPQj5nBAAAYKARIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwFS/YqSqqkq5ublKS0tTfn6+du3a1afjqqur5fF4dOutt/bnbgEAwBAUd4xs2bJFZWVlKi8v1+7duzV58mSVlJToyy+/POdxR48e1W9/+1sVFhb2e7IAAGDoiTtG1q1bp/nz52vevHm68sortWHDBl100UXatGlTr8dEIhHdddddeuyxxzR+/PjvNWEAADC0xBUjnZ2dampqUnFx8bc3kJKi4uJiNTY29nrc448/rjFjxuiee+7p0/2cOnVK4XC4ywYAAIamuGKktbVVkUhEfr+/y36/369gMNjjMR988IFefPFFbdy4sc/3U1FRoYyMjNgWCATimSYAAEgiCX03TXt7u2bPnq2NGzcqMzOzz8ctXbpUbW1tsa2lpSWBswQAAJaGxTM4MzNTXq9XoVCoy/5QKKSsrKxu4z/55BMdPXpUM2fOjO2LRqP/ueNhw3Tw4EFNmDCh23E+n08+ny+eqQEAgCQV15WR1NRU5eXlqb6+PrYvGo2qvr5eBQUF3cZPnDhRe/fuVXNzc2y75ZZbVFRUpObmZp5+AQAA8V0ZkaSysjLNnTtXU6dO1bRp01RZWamOjg7NmzdPkjRnzhyNGzdOFRUVSktL09VXX93l+FGjRklSt/0AAODCFHeMlJaW6sSJE1q5cqWCwaCmTJmiurq62Itajx07ppQUPtgVAAD0jcc556wn8V3C4bAyMjLU1tam9PR06+kAAIA+6OvjN5cwAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACYIkYAAIApYgQAAJgiRgAAgCliBAAAmCJGAACAKWIEAACY6leMVFVVKTc3V2lpacrPz9euXbt6Hbtx40YVFhZq9OjRGj16tIqLi885HgAAXFjijpEtW7aorKxM5eXl2r17tyZPnqySkhJ9+eWXPY5vaGjQnXfeqffee0+NjY0KBAK66aab9Pnnn3/vyQMAgOTncc65eA7Iz8/Xddddp/Xr10uSotGoAoGAHnzwQS1ZsuQ7j49EIho9erTWr1+vOXPm9Ok+w+GwMjIy1NbWpvT09HimCwAAjPT18TuuKyOdnZ1qampScXHxtzeQkqLi4mI1Njb26TZOnjyp06dP65JLLul1zKlTpxQOh7tsAABgaIorRlpbWxWJROT3+7vs9/v9CgaDfbqNxYsXa+zYsV2C5n9VVFQoIyMjtgUCgXimCQAAksigvptmzZo1qq6u1rZt25SWltbruKVLl6qtrS22tbS0DOIsAQDAYBoWz+DMzEx5vV6FQqEu+0OhkLKyss557NNPP601a9bo3Xff1TXXXHPOsT6fTz6fL56pAQCAJBXXlZHU1FTl5eWpvr4+ti8ajaq+vl4FBQW9Hrd27VqtWrVKdXV1mjp1av9nCwAAhpy4roxIUllZmebOnaupU6dq2rRpqqysVEdHh+bNmydJmjNnjsaNG6eKigpJ0u9//3utXLlSr7zyinJzc2OvLbn44ot18cUXD+C3AgAAklHcMVJaWqoTJ05o5cqVCgaDmjJliurq6mIvaj127JhSUr694PL888+rs7NTt99+e5fbKS8v16OPPvr9Zg8AAJJe3J8zYoHPGQEAIPkk5HNGAAAABhoxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwBQxAgAATBEjAADAFDECAABMESMAAMAUMQIAAEwRIwAAwNQw6wlYiUQi2rFjh44fP67s7GwVFhbK6/VaTwu4oHAeArbOl3OwX1dGqqqqlJubq7S0NOXn52vXrl3nHP/aa69p4sSJSktL06RJk1RbW9uvyQ6Umpoa5ebmqqioSLNmzVJRUZFyc3NVU1NjOi/gQsJ5CNg6r85BF6fq6mqXmprqNm3a5D766CM3f/58N2rUKBcKhXocv3PnTuf1et3atWvdvn373PLly93w4cPd3r17+3yfbW1tTpJra2uLd7rdvP76687j8ThJXTaPx+M8Ho97/fXX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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(xv, yv, marker='o', color='k', linestyle='none')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "id": "51d28b96-841d-4564-a819-14042c631ca9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(array([[0. , 0.5, 1. ]]),\n",
       " array([[0.],\n",
       "        [1.]]))"
      ]
     },
     "execution_count": 82,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xv, yv = np.meshgrid(x, y, sparse=True)\n",
    "xv, yv"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "id": "f2bd85c1-abc5-4b55-963c-e33bccb9bff7",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((101, 101), (101, 101), (101, 101))"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.linspace(-5, 5, 101)\n",
    "y = np.linspace(-5, 5, 101)\n",
    "xx, yy = np.meshgrid(x, y)\n",
    "zz = np.sqrt(xx**2 + yy**2)\n",
    "xx.shape, yy.shape, zz.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "id": "dd377adc-29c3-496e-b3c6-3959279aa978",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1, 101), (101, 1), (101, 101))"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xs, ys = np.meshgrid(x, y, sparse=True)\n",
    "zs = np.sqrt(xs**2 + ys**2)\n",
    "xs.shape, ys.shape, zs.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "id": "28ccab3c-6a3d-426e-8fb9-a4041c85ca04",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 640x480 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.array_equal(zz, zs)\n",
    "h = plt.contourf(x, y, zs)\n",
    "plt.axis('scaled')\n",
    "plt.colorbar()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ce0917a0-38ce-4246-8553-87fd2a59c7ff",
   "metadata": {},
   "source": [
    "### numpy.mgrid = <numpy.lib._index_tricks_impl.MGridClass object>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "id": "7803d22b-b715-48a5-b5b7-d4a4cab9920b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[0, 0, 0, 0, 0],\n",
       "        [1, 1, 1, 1, 1],\n",
       "        [2, 2, 2, 2, 2],\n",
       "        [3, 3, 3, 3, 3],\n",
       "        [4, 4, 4, 4, 4]],\n",
       "\n",
       "       [[0, 1, 2, 3, 4],\n",
       "        [0, 1, 2, 3, 4],\n",
       "        [0, 1, 2, 3, 4],\n",
       "        [0, 1, 2, 3, 4],\n",
       "        [0, 1, 2, 3, 4]]])"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mgrid[0:5, 0:5]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 87,
   "id": "333e4d7a-f92f-4616-b44b-7812a1540abe",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1. , -0.5,  0. ,  0.5,  1. ])"
      ]
     },
     "execution_count": 87,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mgrid[-1:1:5j]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 88,
   "id": "2e605607-3deb-4494-9d0e-71b958274416",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1. , -0.5,  0. ,  0.5,  1. ])"
      ]
     },
     "execution_count": 88,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.mgrid[-1:1:5j]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f3fdd429-2464-4dc6-8317-3abb68bcf011",
   "metadata": {},
   "source": [
    "### numpy.ogrid = <numpy.lib._index_tricks_impl.OGridClass object>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 89,
   "id": "43044da9-fa87-4202-baba-44138c8d55f2",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-1. , -0.5,  0. ,  0.5,  1. ])"
      ]
     },
     "execution_count": 89,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.ogrid[-1:1:5j]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "id": "29833771-5a0c-4fa0-8302-b23629ca44dc",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[array([[0],\n",
       "        [1],\n",
       "        [2],\n",
       "        [3],\n",
       "        [4]]),\n",
       " array([[0, 1, 2, 3, 4]])]"
      ]
     },
     "execution_count": 90,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.ogrid[0:5,0:5]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9cc68802-ad94-41c0-8d84-36f9fa59fc9c",
   "metadata": {
    "toc-hr-collapsed": true
   },
   "source": [
    "## 创建矩阵\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "diag(v[, k])|提取对角线或构造对角线数组。\n",
    "diagflat(v[, k])|使用展平的输入作为对角线创建二维数组。\n",
    "tri(N[, M, k, dtype])|在给定对角线处及以下且在其他位置为零的数组。\n",
    "tril(m[, k])|数组的下三角。\n",
    "triu(m[, k])|数组的上三角。\n",
    "vander(x[, N, increasing])|生成范德蒙矩阵。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e4dfce22-d846-45c0-8da8-f5c8e68e9238",
   "metadata": {},
   "source": [
    "### numpy.diag(v, k=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "id": "15feb2fe-85f4-42da-99a8-b581bf4bc936",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 2],\n",
       "       [3, 4, 5],\n",
       "       [6, 7, 8]])"
      ]
     },
     "execution_count": 91,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.arange(9).reshape((3,3))\n",
    "x"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "92ba1939-f162-4ff0-9b77-4d0514aacb25",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0, 4, 8])"
      ]
     },
     "execution_count": 92,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.diag(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "d73b2da3-2906-4585-803e-a18900a5af34",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 5])"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.diag(x, k=1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "7234a7f8-d94d-4b89-bc0e-64908e9a0273",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([3, 7])"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.diag(x, k=-1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 95,
   "id": "4a3c9974-2038-48a8-ab6b-033e1976b8f9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 0, 0],\n",
       "       [0, 4, 0],\n",
       "       [0, 0, 8]])"
      ]
     },
     "execution_count": 95,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.diag(np.diag(x))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "acbf680d-337a-4208-a8b8-f915a46066cb",
   "metadata": {},
   "source": [
    "### numpy.diagflat(v, k=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 96,
   "id": "785a6cb9-837c-4433-9481-2c1a2ffee2af",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 0, 0, 0],\n",
       "       [0, 2, 0, 0],\n",
       "       [0, 0, 3, 0],\n",
       "       [0, 0, 0, 4]])"
      ]
     },
     "execution_count": 96,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.diagflat([[1,2], [3,4]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "id": "02012aeb-5f78-4f54-b11e-37ae0a7381e1",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0, 1, 0],\n",
       "       [0, 0, 2],\n",
       "       [0, 0, 0]])"
      ]
     },
     "execution_count": 97,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.diagflat([1,2], 1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5f877e90-0b1a-4662-9424-fdbfe36a900c",
   "metadata": {},
   "source": [
    "### numpy.tri(N, M=None, k=0, dtype=<class 'float'>, *, like=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 98,
   "id": "df3531df-63de-4ba8-b9de-4db2150557fe",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 1, 1, 0, 0],\n",
       "       [1, 1, 1, 1, 0],\n",
       "       [1, 1, 1, 1, 1]])"
      ]
     },
     "execution_count": 98,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.tri(3, 5, 2, dtype=int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 99,
   "id": "24f0ea8a-bf40-4a2c-962a-0cd9ee4f8246",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[0., 0., 0., 0., 0.],\n",
       "       [1., 0., 0., 0., 0.],\n",
       "       [1., 1., 0., 0., 0.]])"
      ]
     },
     "execution_count": 99,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.tri(3, 5, -1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "99c8282d-8e35-4b77-ae78-85b5034d0d89",
   "metadata": {},
   "source": [
    "### numpy.triu(m, k=0)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 100,
   "id": "9c3a1869-1d09-4d14-a495-86ebe4a7138a",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  2,  3],\n",
       "       [ 4,  5,  6],\n",
       "       [ 0,  8,  9],\n",
       "       [ 0,  0, 12]])"
      ]
     },
     "execution_count": 100,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.triu([[1,2,3],[4,5,6],[7,8,9],[10,11,12]], -1)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "id": "a531d138-178e-4dd7-b2a9-26d6d58b9cfe",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[[ 0,  1,  2,  3,  4],\n",
       "        [ 0,  6,  7,  8,  9],\n",
       "        [ 0,  0, 12, 13, 14],\n",
       "        [ 0,  0,  0, 18, 19]],\n",
       "\n",
       "       [[20, 21, 22, 23, 24],\n",
       "        [ 0, 26, 27, 28, 29],\n",
       "        [ 0,  0, 32, 33, 34],\n",
       "        [ 0,  0,  0, 38, 39]],\n",
       "\n",
       "       [[40, 41, 42, 43, 44],\n",
       "        [ 0, 46, 47, 48, 49],\n",
       "        [ 0,  0, 52, 53, 54],\n",
       "        [ 0,  0,  0, 58, 59]]])"
      ]
     },
     "execution_count": 101,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.triu(np.arange(3*4*5).reshape(3, 4, 5))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d7f4ad2b-d6f7-4b19-ac32-0ff6df95f39a",
   "metadata": {
    "tags": []
   },
   "source": [
    "### numpy.vander(x, N=None, increasing=False)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 102,
   "id": "4fdddde2-6e05-46d9-b4ff-8d34c17e2b41",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  1,  1],\n",
       "       [ 4,  2,  1],\n",
       "       [ 9,  3,  1],\n",
       "       [25,  5,  1]])"
      ]
     },
     "execution_count": 102,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([1, 2, 3, 5])\n",
    "N = 3\n",
    "np.vander(x, N)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 103,
   "id": "a9fb7004-e4bf-4383-899f-1e847d417125",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 1,  1,  1],\n",
       "       [ 4,  2,  1],\n",
       "       [ 9,  3,  1],\n",
       "       [25,  5,  1]])"
      ]
     },
     "execution_count": 103,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.column_stack([x**(N-1-i) for i in range(N)])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 104,
   "id": "7005175e-5ac4-4d84-8e60-b0627cea2e6c",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  1,   1,   1,   1],\n",
       "       [  8,   4,   2,   1],\n",
       "       [ 27,   9,   3,   1],\n",
       "       [125,  25,   5,   1]])"
      ]
     },
     "execution_count": 104,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "x = np.array([1, 2, 3, 5])\n",
    "np.vander(x)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "id": "67f00cf5-3a65-4c6d-b608-850359c085e6",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[  1,   1,   1,   1],\n",
       "       [  1,   2,   4,   8],\n",
       "       [  1,   3,   9,  27],\n",
       "       [  1,   5,  25, 125]])"
      ]
     },
     "execution_count": 105,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.vander(x, increasing=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "id": "23fa87a7-bf34-4233-870f-49925490c765",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "48.00000000000003"
      ]
     },
     "execution_count": 106,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.linalg.det(np.vander(x))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 107,
   "id": "2c3c0d78-cc50-4734-a268-2e8c7c1ac20b",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "48"
      ]
     },
     "execution_count": 107,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "(5-3)*(5-2)*(5-1)*(3-2)*(3-1)*(2-1)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5e32ae25-5941-4178-916b-9fd03e77df8e",
   "metadata": {
    "tags": [],
    "toc-hr-collapsed": true
   },
   "source": [
    "## 矩阵类\n",
    "\n",
    "方法|描述\n",
    "--:|:--\n",
    "mat(data[, dtype])|将输入解释为矩阵。\n",
    "bmat(obj[, ldict, gdict])|从字符串，嵌套序列或数组构建矩阵对象。"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f55aef84-a083-425e-9101-0e239729b880",
   "metadata": {},
   "source": [
    "### numpy.bmat(obj, ldict=None, gdict=None)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 108,
   "id": "e3ff22b8-6cb7-4f07-88a4-9c6a2aa40c30",
   "metadata": {
    "tags": []
   },
   "outputs": [],
   "source": [
    "A = np.asmatrix('1 1; 1 1')\n",
    "B = np.asmatrix('2 2; 2 2')\n",
    "C = np.asmatrix('3 4; 5 6')\n",
    "D = np.asmatrix('7 8; 9 0')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 109,
   "id": "353ebaa2-5494-4216-89e6-872f080e9cc9",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[1, 1, 2, 2],\n",
       "        [1, 1, 2, 2],\n",
       "        [3, 4, 7, 8],\n",
       "        [5, 6, 9, 0]])"
      ]
     },
     "execution_count": 109,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.bmat([[A, B], [C, D]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 110,
   "id": "c95a7815-04c3-4e87-b779-f9bdebebe171",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[1, 1, 2, 2],\n",
       "        [1, 1, 2, 2],\n",
       "        [3, 4, 7, 8],\n",
       "        [5, 6, 9, 0]])"
      ]
     },
     "execution_count": 110,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.bmat(np.r_[np.c_[A, B], np.c_[C, D]])"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 111,
   "id": "eebc7c18-29df-44b6-a9f6-ec9013a09bb0",
   "metadata": {
    "tags": []
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "matrix([[1, 1, 2, 2],\n",
       "        [1, 1, 2, 2],\n",
       "        [3, 4, 7, 8],\n",
       "        [5, 6, 9, 0]])"
      ]
     },
     "execution_count": 111,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.bmat('A,B; C,D')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "b151375a-c46d-4cd6-990b-698d38342d10",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  },
  "toc-autonumbering": true
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
